// 配置路由
import Vue from "vue";
import VueRoute from "vue-router";
import routes from "./routes";

// 使用插件
Vue.use(VueRoute);

// 引入store
import store from '@/store';
// 保存原始的push和replace方法，以便后续修改
let originPush = VueRoute.prototype.push
let originReplace = VueRoute.prototype.replace

// 重写Vue Router的push方法，以捕获路由跳转中的错误
VueRoute.prototype.push = function push(location) {
    return originPush.call(this, location).catch(err => err)
}

// 重写Vue Router的replace方法，以捕获路由跳转中的错误
VueRoute.prototype.replace = function replace(location) {
    return originReplace.call(this, location).catch(err => err)
}

let router = new VueRoute({
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        return { y: 0 }
    }
})
// 全局守卫：前置守卫
router.beforeEach(async (to, from, next) => {
    // 用户已经登录，不能在去login界面
    let token = store.state.user.token;
    // 用户信息
    let name = store.state.user.userInfo.name;
    if (token) {
        if (to.path == '/login' || to.path == '/register') {
            next('/')
        } else {
            // 已登录，但不是去login
            if (name) {
                next();
            } else {
                // 登陆了且没有用户信息，派发action
                try {
                    await store.dispatch("getUserInfo");
                    next();
                } catch (error) {
                    // token失效获取不到用户信息
                    // 清除token
                    await store.dispatch("userLogout");
                    next('/login')
                }
            }
        }
    } else {
        // 未登录：不能去交易相关界面、不能去个人中心
        let toPath = to.path;
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 把未登录要去没有去的信息，存储在地址栏中
            next('/login?redirect=' + toPath)
        } else {
            next();
        }
    }
})
export default router;